package edu.upc.autopartescybershop.web;

import edu.upc.autopartescybershop.domain.Categoria;
import edu.upc.autopartescybershop.domain.Marca;
import edu.upc.autopartescybershop.domain.Modelo;
import edu.upc.autopartescybershop.domain.Producto;
import edu.upc.autopartescybershop.service.CategoriaService;
import edu.upc.autopartescybershop.service.MarcaService;
import edu.upc.autopartescybershop.service.ModeloService;
import edu.upc.autopartescybershop.service.ProductoService;
import java.beans.PropertyEditorSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;

/**
 *
 * @author Carlos
 */
@Controller
public class ProductosController
{

    @Autowired
    ProductoService productoService;
    @Autowired
    CategoriaService categoriaService;
    @Autowired
    MarcaService marcaService;
    @Autowired
    ModeloService modeloService;

    @RequestMapping(value = "/productos.htm", method = RequestMethod.GET)
    public ModelAndView listadoProductos()
    {
        ModelAndView mav = new ModelAndView("productos");
        mav.addObject("listadoProductos", productoService.obtenerProductos());
        return mav;
    }

    @RequestMapping(value = "/productos_form.htm", method = RequestMethod.GET)
    public ModelAndView setupForm(@RequestParam("accion") String accion, @RequestParam("id") int codigoProducto)
    {
        Producto producto = null;

        if (accion.equals("E"))
        {
            producto = productoService.obtenerProducto(codigoProducto);
        }
        else if (accion.equals("D"))
        {
            producto = productoService.obtenerProducto(codigoProducto);
            producto.setNombre("-*D*-");
        }
        else if (accion.equals("N"))
        {
            producto = new Producto();
        }

        ModelAndView mav = new ModelAndView("productos_form", "producto", producto);
        mav.addObject("categorias", categoriaService.obtenerCategorias());
        mav.addObject("marcas", marcaService.obtenerMarcas());
        mav.addObject("modelos", modeloService.obtenerModelos());
        return mav;
    }

    @RequestMapping(value = "/productos_form.htm", method = RequestMethod.POST)
    public String onsubmit(@ModelAttribute("producto") Producto producto,
            BindingResult result, SessionStatus status, @RequestParam("accion") String accion, @RequestParam("id") int codigoProducto)
    {
        if (accion.equals("E") || accion.equals("N"))
        {
            productoService.grabarProducto(producto);
        }
        else if (accion.equals("D"))
        {
            productoService.eliminarProducto(codigoProducto);
        }
        return "redirect:/productos.htm";
    }

    @InitBinder
    public void initBinder(WebDataBinder binder)
    {
        binder.registerCustomEditor(Categoria.class, "categoriaPadre", new PropertyEditorSupport()
        {

            @Override
            public void setAsText(String text) throws IllegalArgumentException
            {
                Categoria categoria = categoriaService.obtenerCategoria(Integer.parseInt(text));
                setValue(categoria);
            }
        });
        binder.registerCustomEditor(Marca.class, "marcaPadre", new PropertyEditorSupport()
        {

            @Override
            public void setAsText(String text) throws IllegalArgumentException
            {
                Marca marca = marcaService.obtenerMarca(Integer.parseInt(text));
                setValue(marca);
            }
        });
        binder.registerCustomEditor(Modelo.class, "modeloPadre", new PropertyEditorSupport()
        {

            @Override
            public void setAsText(String text) throws IllegalArgumentException
            {
                Modelo modelo = modeloService.obtenerModelo(Integer.parseInt(text));
                setValue(modelo);
            }
        });
    }
}
